package com.ktjy.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

/**
 * @return 13141
 * 2025/6/22
 * 21:09
 */
@Aspect // 表示这是一个切面类
@Component // 结合扫描包，产生 bean 对象注入到 IoC 容器中
public class TransactionAspect {
    private static final Logger log = LoggerFactory.getLogger(TransactionAspect.class);

    // 定义切入点，方法名则为引用名称
    @Pointcut("execution(* com.ktjy.service..*.*(..))")
    public void pt() {}
    /**
     * 前置增强-打开数据库连接开启事务
     */
    @Before(value = "pt()")
    public void before(JoinPoint jp) {
        log.info("【TransactionAspect前置增强】模拟打开数据库连接并开启事务...");
        log.info("Sqlsession sqlSession = MyBatisUtil.createSqlsession(false)");
    }

    /**
     * 后置增强-执行事务提交
     */
    @AfterReturning(value = "pt()", returning = "result")
    public void afterReturning(JoinPoint jp, Object result) {
        log.info("【TransactionAspect后置增强】模拟正常完成业务提交事务...");
        log.info("session.commit()");
    }

    /**
     * 异常抛出增强
     */
    @AfterThrowing(value = "pt()", throwing = "e")
    public void afterThrowing(JoinPoint jp, Throwable e) {
        log.info("【TransactionAspect异常抛出增强】模拟业务异常回滚事务，异常信息为：" + e.getMessage());
        log.info("session.rollback();");
    }

    /**
     * 最终增强-执行关闭数据库资源
     */
    @After(value = "pt()")
    public void after(JoinPoint jp) {
        log.info("【TransactionAspect最终增强】模拟业务释放资源...");
        log.info("MyBatisUtil.closeSqlSession(sqlSession);");
    }
}
